import { Http } from './../../utils/http/http';
import UtilService from '@/utilservice/util-service';

export default class AppDashboardDesignService {
    /**
     * 工具服务对象
     *
     * @protected
     * @type {UtilService}
     * @memberof AppDashboardDesignService
     */
    protected utilService: UtilService = new UtilService();

    /**
     * 加载数据模型
     *
     * @param {string} serviceName
     * @param {*} context
     * @param {*} viewparams
     * @memberof AppDashboardDesignService
     */
    public loadModel(serviceName: string, context: any, viewparams: any) {
        return new Promise((resolve: any, reject: any) => {
            this.utilService
                .getService(serviceName)
                .then((service: any) => {
                    service
                        .loadModelData(JSON.stringify(context), viewparams)
                        .then((response: any) => {
                            resolve(response);
                        })
                        .catch((response: any) => {
                            reject(response);
                        });
                })
                .catch((response: any) => {
                    reject(response);
                });
        });
    }

    /**
     * 保存模型
     *
     * @param {string} serviceName
     * @param {*} context
     * @param {*} viewparams
     * @returns
     * @memberof AppDashboardDesignService
     */
    public saveModel(serviceName: string, context: any, viewparams: any) {
        return new Promise((resolve: any, reject: any) => {
            this.utilService
                .getService(serviceName)
                .then((service: any) => {
                    service
                        .saveModelData(JSON.stringify(context), '', viewparams)
                        .then((response: any) => {
                            resolve(response);
                        })
                        .catch((response: any) => {
                            reject(response);
                        });
                })
                .catch((response: any) => {
                    reject(response);
                });
        });
    }

    /**
     * 加载门户部件集合
     *
     * @memberof AppDashboardDesignService
     */
    public loadPortletList(context: any, viewparams: any): Promise<any> {
        return new Promise((resolve: any, reject: any) => {
            Http.getInstance()
                .get('./assets/json/portlet-data.json')
                .then((response: any) => {
                    if (response && response.status === 200 && response.data) {
                        let result: Array<any> = [];
                        if (typeof response.data == 'string') {
                            const index: number = response.data.lastIndexOf(',');
                            result = JSON.parse(response.data.slice(0, index) + ']');
                        } else {
                            result = response.data;
                        }
                        const datas: any[] = this.filterData(result, viewparams.appdeName);
                        const list = this.prepareList(datas);
                        const groups = this.prepareGroup(datas);
                        resolve({ data: datas, result: list.reverse(), groups: groups });
                    }
                })
                .catch((response: any) => {
                    console.log(response);
                });
        });
    }

    /**
     * 过滤数据
     *
     * @param {any[]} datas
     * @memberof AppDashboardDesignService
     */
    public filterData(datas: any[] = [], dataType: string): any[] {
        let items: any[] = [];
        datas.forEach((data: any) => {
            if (Object.is(data.type, 'app')) {
                items.push(data);
            }
            if (Object.is(data.appCodeName, dataType)) {
                items.push(data);
            }
        });
        return items;
    }

    /**
     * 分组集合
     *
     * @param {any[]} [datas=[]]
     * @returns {any[]}
     * @memberof AppDashboardDesignService
     */
    public prepareGroup(datas: any[] = []): any[] {
        let items: any[] = [];
        datas.forEach((data: any) => {
            let item = items.find((item: any) => Object.is(item.value, data.groupCodeName));
            if (item) {
                let _item = item.children.find((a: any) => Object.is(a.portletCodeName, data.portletCodeName));
                if (!_item) {
                    item.children.push(data);
                }
            } else {
                items.push({ name: data.groupName, value: data.groupCodeName, children: [data] });
            }
        });
        return items;
    }

    /**
     * 准备list集合
     *
     * @memberof AppDashboardDesignService
     */
    public prepareList(datas: any[] = []): any[] {
        let list: any[] = [];
        datas.forEach((data: any) => {
            let item = list.find((item: any) => Object.is(data.type, item.type));
            if (!item) {
                item = {};
                Object.assign(item, {
                    type: data.type,
                    name: Object.is(data.type, 'app') ? '全局' : data.appName,
                    children: [],
                });
                list.push(item);
            }
            this.prepareList2(item.children, data);
        });
        return list;
    }

    /**
     * 准备list项集合
     *
     * @param {any[]} [children=[]]
     * @param {*} [data={}]
     * @memberof AppDashboardDesignService
     */
    public prepareList2(children: any[] = [], data: any = {}) {
        let item = children.find((item: any) => Object.is(data.groupCodeName, item.type));
        if (!item) {
            item = {};
            Object.assign(item, {
                type: data.groupCodeName,
                name: data.groupName,
                children: [],
            });
            children.push(item);
        }
        let _item = item.children.find((a: any) => Object.is(a.portletCodeName, data.portletCodeName));
        if (!_item) {
            item.children.push(data);
        }
    }
}
